# 误差的处理
def main():
    # 打印数字信息
    print("您的浏览支持的最大数是：", float('inf'), "最小数是：", float('-inf'))
    # 0.1+0.2 不等于 0.3
    print(0.1 + 0.2)
    # 0.09999999 + 0.00000001 不等于 0.1
    print(0.09999999 + 0.00000001)
    # 11111111111111119 不等于 11111111111111119
    print(11111111111111119)
    # -2147483648 + -1 = -2147483649
    print(int(-2147483648) + int(-1))

    # 化整法
    a = 0.1
    b = 0.2
    c = 0
    c = (a * 10 + b * 10) / 10
    print(c)
    P = 3.141592653589793  # 这里使用 Python 中的 math.pi 也可以，为了和原代码结构一致，直接写值
    # 简算法
    str_exp = "2*P / 4*P"
    str_exp = str_exp.replace('P', '1')
    result = eval(str_exp)
    print(result)

    # 模拟笔算 将数字看成字符串
    str_a = '0.1'
    str_b = '0.2'
    sum1 = add(str_a, str_b)
    print(f'{str_a}+{str_b}={sum1}')
    sum2 = add('0.09999999', '0.00000001')
    print('0.09999999+0.00000001=', sum2)
    # 有整数部
    sum3 = add('10.1', '2.02')
    print('10.1+2.02=', sum3)


def add(n1, n2):
    # 寻找小数位
    ns1 = n1[n1.rfind('.'):]
    ns2 = n2[n2.rfind('.'):]
    s1 = len(ns1)
    s2 = len(ns2)
    # 将两个小数部分补齐
    if s2 > s1:
        len_diff = s2 - s1
        ns1 += '0' * len_diff
    elif s1 > s2:
        len_diff = s1 - s2
        ns2 += '0' * len_diff
    # 循环计算小数部分
    tem = 0  # 是否进位
    str_sum = ''
    for i in range(len(ns2) - 1, 0, -1):
        # 先求和 包括进位数
        sum_num = int(ns2[i]) + int(ns1[i]) + tem
        # 如果大于 10 进位 并保留余数
        if sum_num >= 10:
            str_sum = str(sum_num - 10) + str_sum
            tem = 1
        else:
            tem = 0
            str_sum = str(sum_num) + str_sum
    # 计算整数部分 正常计算即可
    int1 = n1[:n1.rfind('.')]
    int2 = n2[:n2.rfind('.')]
    int_sum = int(int1) + int(int2) + tem  # 包括进位数
    # 最终结果拼接整数部分与小数部分
    str_sum = str(int_sum) + '.' + str_sum
    return str_sum


if __name__ == "__main__":
    main()